package com.wzh.glsc.order.controller;

import com.wzh.glsc.order.entity.OrderEntity;
import com.wzh.glsc.order.entity.OrderReturnReasonEntity;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * @author xiaoming
 * @PackageName:com.wzh.glsc.order.controller
 * @ClassName:@{NAME}
 * @Description:
 * @date:@{DATE}@{TIME}
 */

@Log4j2
@RestController
@RequestMapping("/rabbit")
public class RabbitController {
    @Autowired
    RabbitTemplate rabbitTemplate;

    @GetMapping("/sendMessage")
    public String sendMessage(){
        //发送的对象
        OrderReturnReasonEntity reasonEntity=new OrderReturnReasonEntity();
        reasonEntity.setName("张三");
        reasonEntity.setStatus(1);
        reasonEntity.setId(1223L);
        OrderEntity order=new OrderEntity();
        order.setReceiverName("test");
        //在引入amqp时，自动配置类:RabbitAutoConfiguration  就会生效
        //RabbitAutoConfiguration 会自动注入RabbitTemplate。
        // 使用send 发送一个Message对象出去:send(new Message());
        // 这里使用convertAndSend()：转换并发送消息
        //                这里消息内容如果是一个对象，会将使用序列化机制，将对象写出去。对象需要实现 Serializable 接口。
        // 参数： exchange:发送消息到哪个交换机，routingKey：消息的路由key,  object : 消息内容

        for (int i=0;i<10;i++){
            if(i%2==0){
                rabbitTemplate.convertAndSend("test-exchange-direct","hello.java",order, new CorrelationData(UUID.randomUUID().toString()));
                log.info("发送完成：【{}】,{}", order,i);
            }else {
                rabbitTemplate.convertAndSend("test-exchange-direct","hello.java",reasonEntity, new CorrelationData(UUID.randomUUID().toString()));
                log.info("发送完成：【{}】,{}", reasonEntity,i);
            }
        }

        //在RabbitAutoConfiguration注入rabbitTemplate时，会看容器中是否有消息转换器，没有就默认为SimpleMessageConverter
        //默认的消息转换器：SimpleMessageConverter:简单的消息转换器,使用序列化的方式转成byte[]。
        //                  (继承关系:MessageConverter<-AbstractMessageConverter<-AllowedListDeserializingMessageConverter<-SimpleMessageConverter)
        //
        // 将对象转成json的序列化机制，可以放一个Jackson2JsonMessageConverter类型的消息转换器在容器中
        //需要往容器中放入一个Jackson2JsonMessageConverter消息转换器(application/json格式)
        //     (继承关系:MessageConverter<-AbstractJackson2MessageConverter<-Jackson2JsonMessageConverter)

        return "ok";
    }
}
